package namespace

import (
	"context"
	"krm_pro/config"

	"github.com/gin-gonic/gin"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

var namespaceSet = config.ClientSet.CoreV1().Namespaces

type nsInfo struct {
	Name      string `json:"name"`
	Namespace string `json:"namespace"`
	Ns        *corev1.Namespace
	NsList    *corev1.NamespaceList
}

func NsList(r *gin.Context) {
	ns := list()
	r.JSON(200, gin.H{
		"message":   "namespace list completed",
		"namespace": ns,
	})
}

func NsGet(r *gin.Context) {
	ns := nsInfo{}
	if err := r.ShouldBindJSON(&ns); err != nil {
		r.JSON(200, gin.H{
			"status":  400,
			"message": "shouldbind false",
		})
		return
	}
	ns.Ns = get(ns.Name)
	r.JSON(200, gin.H{
		"message":   "namespace get completed",
		"namespace": ns.Ns,
	})

}

func NsCreate(r *gin.Context) {
	ns := nsInfo{}
	if err := r.ShouldBindJSON(&ns); err != nil {
		r.JSON(200, gin.H{
			"status":  400,
			"message": "shouldbind false",
		})
		return
	}
	ns.Ns = create(ns.Ns)
	r.JSON(200, gin.H{
		"message":   "namespace create completed",
		"namespace": ns.Ns,
	})

}

func NsUpdate(r *gin.Context) {
	ns := nsInfo{}
	if err := r.ShouldBindJSON(&ns); err != nil {
		r.JSON(200, gin.H{
			"status":  400,
			"message": "shouldbind false",
		})
		return
	}
	ns.Ns = update(ns.Ns)
	r.JSON(200, gin.H{
		"message":   "namespace update completed",
		"namespace": ns.Ns,
	})

}

func NsDelete(r *gin.Context) {
	ns := nsInfo{}
	if err := r.ShouldBindJSON(&ns); err != nil {
		r.JSON(200, gin.H{
			"status":  400,
			"message": "shouldbind false",
		})
		return
	}
	delete(ns.Name)
	r.JSON(200, gin.H{
		"message": "namespace delete completed",
	})

}
func list() *corev1.NamespaceList {
	namepsace, err := namespaceSet().List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}
	return namepsace
}

func get(name string) *corev1.Namespace {
	namepsace, err := namespaceSet().Get(context.TODO(), name, metav1.GetOptions{})
	if err != nil {
		panic(err.Error())
	}
	return namepsace
}
func create(namespace *corev1.Namespace) *corev1.Namespace {
	namepsace, err := namespaceSet().Create(context.TODO(), namespace, metav1.CreateOptions{})
	if err != nil {
		panic(err.Error())
	}
	return namepsace
}
func update(namespace *corev1.Namespace) *corev1.Namespace {
	namepsace, err := namespaceSet().Update(context.TODO(), namespace, metav1.UpdateOptions{})
	if err != nil {
		panic(err.Error())
	}
	return namepsace
}
func delete(name string) {
	err := namespaceSet().Delete(context.TODO(), name, metav1.DeleteOptions{})
	if err != nil {
		panic(err.Error())
	}
}
